/*
有一个n*m的草坪(1 <= n, m <= 100)，草坪中的草原来的高度都是100。现在使用割草机修剪草坪，来得到各种各样的图案。割草机只 能横着或者竖着割草。每次割草都会先设定一个高度，割完之后会把比设定高度高的草都割成设定的高度。比如草原来是5 2 8，设定高度为4，那么割完之后就变成了4 2 4。
现在给出一个图案，问是否可以把草坪割成图案的样子。
输入第一行包含两个整数n和m。
接下来为n行输入，每行包含m个不大于100的正整数。
如果可以修剪成输入的图案，则输出“YES”，否则输出“NO”。
*/


#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif
#if defined(_WIN32) && !defined(__cplusplus)
#define inline __inline
#endif

#include <stdio.h>

#define max(a,b)    (((a) > (b)) ? (a) : (b))

int main()
{
	int n, m;

	int rowMax[100] = {0};
	int colMax[100] = {0};
	int lawn[100][100];

	scanf("%d%d", &n, &m);
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			scanf("%d", &lawn[i][j]);
			rowMax[i] = max(lawn[i][j], rowMax[i]);
			colMax[j] = max(lawn[i][j], colMax[j]);
		}
	}

	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			if (rowMax[i] != lawn[i][j] && colMax[j] != lawn[i][j])
			{
				printf("NO\n");
				return 0;
			}
		}
	}

	printf("YES\n");

	return 0;
}